package com.sheng.leetcode.year2025.month09.day12;

import org.junit.Test;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * @author by ls
 * @date 2025/9/16
 * <p>
 * 3227. 字符串元音游戏<p>
 * <p>
 * 小红和小明在玩一个字符串元音游戏。<p>
 * 给你一个字符串 s，小红和小明将轮流参与游戏，小红 先 开始：<p>
 * 在小红的回合，她必须移除 s 中包含 奇数 个元音的任意 非空 子字符串。<p>
 * 在小明的回合，他必须移除 s 中包含 偶数 个元音的任意 非空 子字符串。<p>
 * 第一个无法在其回合内进行移除操作的玩家输掉游戏。假设小红和小明都采取 最优策略 。<p>
 * 如果小红赢得游戏，返回 true，否则返回 false。<p>
 * 英文元音字母包括：a, e, i, o, 和 u。<p>
 * <p>
 * 示例 1：<p>
 * 输入： s = "leetcoder"<p>
 * 输出： true<p>
 * 解释：<p>
 * 小红可以执行如下移除操作来赢得游戏：<p>
 * 小红先手，她可以移除加下划线的子字符串 s = "leetcoder"，其中包含 3 个元音。结果字符串为 s = "der"。<p>
 * 小明接着，他可以移除加下划线的子字符串 s = "der"，其中包含 0 个元音。结果字符串为 s = "er"。<p>
 * 小红再次操作，她可以移除整个字符串 s = "er"，其中包含 1 个元音。<p>
 * 又轮到小明，由于字符串为空，无法执行移除操作，因此小红赢得游戏。<p>
 * <p>
 * 示例 2：<p>
 * 输入： s = "bbcd"<p>
 * 输出： false<p>
 * 解释：<p>
 * 小红在她的第一回合无法执行移除操作，因此小红输掉了游戏。<p>
 * <p>
 * 提示：<p>
 * 1 <= s.length <= 10^5<p>
 * s 仅由小写英文字母组成。<p>
 */
public class LeetCode3227 {

    @Test
    public void test() {
        String s = "leetcoder";
//        String s = "bbcd";
        System.out.println(new Solution().doesAliceWin(s));
    }
}

class Solution {

    private static final Set<Character> VOWELS = new HashSet<>(Arrays.asList('a', 'e', 'i', 'o', 'u'));

    public boolean doesAliceWin(String s) {
        // 小红：移除奇数个元音的子字符串
        // 小明：移除偶数个元音的子字符串
        // 小红想赢 -> 先手移除之后，保证元音是奇数即可 ->
        //      如果一开始字符串内包含有奇数个元音，直接移除整个字符串即可，如果一开始包含偶数个元音，同样可以移除奇数个元音
        //      除非先手字符串里面没有一个元音，否则小红必赢
        // 小明想赢 -> 将元音全部移除即可
        for (char c : s.toCharArray()) {
            if (VOWELS.contains(c)) {
                return true;
            }
        }
        return false;
    }
}
